package com.ads.tpgrupo4.server.xml.mappers;

import sun.reflect.generics.reflectiveObjects.NotImplementedException;

import com.ads.tpgrupo4.domain.cpr.core.Cliente;
import com.ads.tpgrupo4.domain.cpr.core.Rodamiento;
import com.ads.tpgrupo4.domain.cpr.cotizacion.ItemCotizacionDeRodamiento;
import com.ads.tpgrupo4.domain.cpr.facturacion.Factura;
import com.ads.tpgrupo4.domain.cpr.facturacion.ItemFactura;
import com.ads.tpgrupo4.domain.cpr.remito.ItemRemitoACliente;
import com.ads.tpgrupo4.domain.cpr.remito.Remito;
import com.ads.tpgrupo4.server.utils.DateUtils;
import com.ads.tpgrupo4.server.xml.StringBasedXmlSource;
import com.ads.tpgrupo4.server.xml.XmlSource;

public class FacturaXmlMapper extends AbstractXmlMapper<Factura> {

	private static FacturaXmlMapper instance;
	
	public static FacturaXmlMapper getInstance() {

		if (instance == null) {
			instance = new FacturaXmlMapper();
		}
		
		return instance;
	}
	
	private FacturaXmlMapper() {
	}
	
	@Override
	public XmlSource map(final Factura factura) throws Exception {

		final StringBuilder sb = new StringBuilder();
		sb.append("<Factura numero=\"nroDeFactura\">\r\n" + 
				" <Fechas>\r\n" + 
				"  <Emision>fechaEmison</Emision>\r\n" + 
				"  <Vencimiento>fechaVencimiento</Vencimiento>\r\n" + 
				" </Fechas>\r\n" + 
				" <Cliente>\r\n" + 
				"  <Cuil>cuilCliente</Cuil>\r\n" + 
				"  <RazonSocial>razonSocialCliente</RazonSocial>\r\n" + 
				"  <CondicionIva>condicionIvaCliente</CondicionIva>\r\n" + 
				" </Cliente>\r\n" + 
				" <Referencia>");
		
		sb.append("<Remito>\r\n" + 
				"   <Numero>nroDeRemito</Numero>\r\n" + 
				"   <Fecha>fechaRemito</Fecha>\r\n" + 
				"  </Remito>");
		sb.append("<Rodamientos>");
		
		final Remito remito = factura.getRemitos().iterator().next();
		final Cliente cliente = factura.getCliente();
		
		String xml = sb.toString();
		xml = xml.replace("nroDeFactura", factura.getNumero().toString());
		xml = xml.replace("fechaEmison", DateUtils.toXmlDateTimeString(factura.getFechaEmision()));
		xml = xml.replace("fechaVencimiento", DateUtils.toXmlDateTimeString(factura.getFechaVencimiento()));
		xml = xml.replace("cuilCliente", cliente.getCuil());
		xml = xml.replace("razonSocialCliente", cliente.getRazonSocial());
		xml = xml.replace("condicionIvaCliente", Boolean.TRUE.equals(cliente.getIvaExento()) ? "exento" : "responsable");
		xml = xml.replace("nroDeRemito", remito.getNumero().toString());
		xml = xml.replace("fechaRemito", DateUtils.toXmlDateTimeString(remito.getFechaEmision()));

		final StringBuilder sbItems = new StringBuilder();
		
		for (final ItemFactura itemFactura : factura.getItems()) {
			
			final ItemRemitoACliente itemRemito = itemFactura.getItemsOrigen().iterator().next();
			final ItemCotizacionDeRodamiento itemCotizacion = (ItemCotizacionDeRodamiento)itemRemito.getItemsOrigen().get(0).getItemOrigen();
			final Rodamiento rodamiento = itemCotizacion.getRodamiento();
			
			String itemXml = " <Item serie=\"nroDeSerie\"> \r\n" + 
							"		<Sufijo>sufix</Sufijo>\r\n" + 
							"		<Marca>marca</Marca> \r\n" + 
							"		<Origen>pais</Origen>\r\n" + 
							"		<Precio>precio</Precio>\r\n" + 
							"		<Cantidad>cantidadUnidades</Cantidad>\r\n" + 
							"    </Item>";		
			 
			itemXml = itemXml.replace("nroDeSerie", rodamiento.getNumeroDeSerie());
			itemXml = itemXml.replace("sufix", rodamiento.getSufijo());
			itemXml = itemXml.replace("marca", rodamiento.getMarca());
			itemXml = itemXml.replace("pais", rodamiento.getOrigen());
			itemXml = itemXml.replace("precio", String.valueOf(itemFactura.getMonto()));
			itemXml = itemXml.replace("cantidadUnidades", String.valueOf(itemFactura.getCantidad()));
			
			sbItems.append(itemXml);
		}
		
		sbItems.append("</Rodamientos>\r\n");
		sbItems.append("</Referencia>\r\n" + 
				"</Factura> ");
	
		final String result = xml.concat(sbItems.toString());
		
		return new StringBasedXmlSource(result);
	}
	
	@Override
	protected Factura doMap(final XmlSource source) throws Exception {
		throw new NotImplementedException();
	}
	
}
